Python数据类型-List介绍(下)-列表推导式
列表(list)作为python最基础也是最重要的数据类型之一,在python数据分析以及其他用途中有着重要的作用。
本文是 Python数据类型-List介绍(上) 的姊妹篇。
通过这两篇文章来对List做一个相对系统的介绍,希望对于熟悉list有所帮助。
Start
本文的运行环境:
windows7系统
python3.5
jupyter notebook
6 列表推导式(List Comprehension)
6.1 列表推导式的一般情况
列表推导式的一般语法结构:
new_list = [x for x in iterable]
其中的 iterable 表示可迭代的对象,包括字符串(str)、列表(list),元组(tuple)、字典(dict)、集合(set),以及生成器(generator)等。
先来看几个简单的例子:
str_list = [x.lower() for x in "Lemon"]
str_list
['l', 'e', 'm', 'o', 'n']
list_list = [x**2 for x in [1,2,3,4]]
list_list
[1, 4, 9, 16]
tuple_list = [x+2 for x in (1,2,3,4)]
tuple_list
[3, 4, 5, 6]
ge_list = [x for x in range(8)]
ge_list
[0, 1, 2, 3, 4, 5, 6, 7]
6.2 两层for循环的列表推导式
列表推导式中,可以同时包含多个for循环,比如同时两个for循环,如下:
[x**2+y for x in range(5) for y in range(4,7)]
[4, 5, 6, 5, 6, 7, 8, 9, 10, 13, 14, 15, 20, 21, 22]
上述结果跟下面的写法结果是一致的:
two_for_list = []
for x in range(5):
for y in range(4,7):
two_for_list.append(x**2+y)
print(two_for_list)
[4, 5, 6, 5, 6, 7, 8, 9, 10, 13, 14, 15, 20, 21, 22]
列表推导式中,三层或者三层以上的for循环一般很少用到。
6.3 使用两个变量来生成list
列表推导式也可以使用两个或多个变量来生成list,结合字典的使用,举例如下:
d = {'x': '1', 'y':'2', 'z':'4'}
d_list = [k+'='+v for k,v in d.items()]
d_list
['z=4', 'y=2', 'x=1']
6.4 含if语句的列表推导式
列表推导式中还可以引入 if 条件语句,如下:
if_list = [x**2 for x in range(10) if x%2==0]
if_list
[0, 4, 16, 36, 64]
上述列表推导式,如果用普通的for循环来编写的话,内容如下:
if_list_1 = []
for x in range(10):
if x%2==0:
if_list_1.append(x**2)
print(if_list_1)
[0, 4, 16, 36, 64]
通过对比,可以看出列表推导式的方式更显得 Pythonic。
当然,如果仅仅是编写上更简洁,可能不一定能显现出 列表推导式的优势,下面我们来对比下上述两种方式的运行效率。
%%timeit
if_list = [x**2 for x in range(10) if x%2==0]
if_list
100000 loops, best of 3: 6.06 µs per loop
%%timeit
def for_loop():
if_list_1 = []
for x in range(10):
if x%2==0:
if_list_1.append(x**2)
return if_list_1
for_loop()
100000 loops, best of 3: 6.76 µs per loop
从上面的运行结果进行对比,可以看出列表推导式的运行效率要高于普通的 for循环编写方式。
因为,建议大家使用列表推导式,不仅写法更 Pythonic,且运行效率更高。
包含if-else语句的列表推导式
[x**2 if x%2==0 else x+2 for x in range(10)]
[0, 3, 4, 5, 16, 7, 36, 9, 64, 11]
包含两个if语句的列表推导式
[x**2 for x in range(10) if x%2==0 if x%3==0]
[0, 36]
7 小结
如果想获取离散的元素,比如想获得第1、2、4个元素,能不能通过离散的索引值来获取呢?
前面已经实践过,直接通过离散的索引值来获取列表中的元素是不行的。
通过列表推导式的学习,我们可以换一种思路,来实现列表中离散的元素的获取,如下:
[c_list[i] for i in [0,1,3]]
['James', 'Ava', 'Emma']
列表(list)作为python最基础也是最重要的数据类型之一,在python数据分析以及其他用途中有着重要的作用,希望上述内容能对于熟悉list有所帮助。
如果您喜欢我的文章,欢迎推荐给您的朋友!
End
精选文章(点击图片即可查看文章):
公众号精华文章推荐
公众号导航
ID:PyDataRoad
微信公众号后台回复数字「 8 」,访问个人官网。
微信公众号后台回复数字「 1 」,获取公众号导航内容,包括部分文章源代码,精华文章等。
在微信公众号后台回复「 微信群 」,和小伙伴们一起入群。